package com.huaxin.device.dto.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;

/**
 * 断路器操作枚举 (Circuit Breaker Action)
 * 专用于定义可对断路器设备执行的控制命令
 * 如：合闸、分闸、重合闸等
 */
public enum CircuitBreakerAction implements BaseCodeEnum<String> {

    // -------------------- 基础开关操作 --------------------
    /**
     * 合闸 (Close)
     * 闭合主触点，接通电路，使负载得电运行
     * 是断路器最基本的“开启”操作
     */
    CLOSE("close", "合闸"),

    /**
     * 分闸 (Open)
     * 断开主触点，切断电路，使负载失电停止
     * 是断路器最基本的“关闭”操作
     */
    OPEN("open", "分闸"),

    /**
     * 远程分闸 (Remote Trip)
     * 通过远程信号触发断路器脱扣机构，实现分闸
     * 区别于本地手动分闸，强调“远程控制”属性
     */
    REMOTE_TRIP("remote_trip", "远程分闸"),

    // -------------------- 高级保护与控制操作 --------------------
    /**
     * 重合闸 (Reclose)
     * 在故障跳闸后，按预设逻辑自动或手动重新合闸
     * 适用于瞬时性故障恢复场景
     */
    RECLOSURE("reclosure", "重合闸"),

    /**
     * 闭锁 (Lockout)
     * 永久性锁定断路器在分闸状态，禁止任何合闸操作
     * 通常用于维护、检修等安全隔离场景
     */
    LOCKOUT("lockout", "闭锁"),

    /**
     * 解锁 (Unlock)
     * 解除“闭锁”状态，恢复断路器的正常控制功能
     * 必须在安全确认后执行
     */
    UNLOCK("unlock", "解锁"),

    /**
     * 故障复位 (Fault Reset)
     * 清除断路器内部的故障记忆状态（如过流、短路标志）
     * 复位后方可进行合闸操作
     */
    FAULT_RESET("fault_reset", "故障复位");

    @EnumValue
    private final String code;
    private final String displayName;

    CircuitBreakerAction(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 根据 code 获取对应的枚举实例
     *
     * @param code 操作代码 (如 "close", "open", "reclosure")
     * @return 对应的 CircuitBreakerAction 枚举，如果未找到则返回 null
     */
    public static CircuitBreakerAction of(String code) {
        for (CircuitBreakerAction action : values()) {
            if (action.getCode().equalsIgnoreCase(code) ||
                    action.getDisplayName().equalsIgnoreCase(code)) {
                return action;
            }
        }
        return null;
    }

    /**
     * 判断指定的 code 是否为有效的断路器操作
     *
     * @param code 待验证的代码或名称
     * @return true 表示是有效的操作
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }

    /**
     * 判断该操作是否会导致断路器处于“闭合/导通”状态
     *
     * @return true 表示是开启类操作
     */
    public boolean isOpeningAction() {
        return this == CLOSE || this == RECLOSURE;
    }

    /**
     * 判断该操作是否会导致断路器处于“断开/关断”状态
     *
     * @return true 表示是关闭类操作
     */
    public boolean isClosingAction() {
        return this == OPEN || this == REMOTE_TRIP || this == LOCKOUT;
    }

    /**
     * 判断该操作是否为“安全锁定”类操作
     *
     * @return true 表示是闭锁或解锁操作
     */
    public boolean isLockingAction() {
        return this == LOCKOUT || this == UNLOCK;
    }

    /**
     * 判断该操作是否为“复位/恢复”类操作
     *
     * @return true 表示是故障复位或解锁操作
     */
    public boolean isResetAction() {
        return this == FAULT_RESET || this == UNLOCK;
    }
}